package servlet;

import com.alibaba.fastjson.JSONObject;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

@MultipartConfig    //标识Servlet支持文件上传
@WebServlet(urlPatterns = "/imageUpload")
public class MdImageUpload extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        JSONObject res = new JSONObject();
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        String savePath = request.getServletContext().getRealPath("/uploadFile");  //存储路径
        File path = new File(savePath);
        if (!path.exists()) { //如果路径不存在则创建
            path.mkdirs();
        }

        Collection<Part> parts = request.getParts(); //获取上传的文件集合
        if (parts != null && parts.size() == 1) {   //上传单个文件
            Part part = request.getPart("editormd-image-file"); //-----① 通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象
            String header = part.getHeader("content-disposition");//获取请求头
            String fileName = getFileName(header);
            // 生成新的文件名，可以根据需要进行自定义
            //获取文件的扩展名
            String fileExtension = fileName.substring(fileName.lastIndexOf("."));
            String newFileName = System.currentTimeMillis()+fileExtension; // 替换为您想要的新文件名，包括扩展名
            // 根据保存路径和新文件名生成完整的文件路径
            String newFilePath = savePath + File.separator + newFileName;
            // 将文件写入到新路径
            part.write(newFilePath);
//            String url = savePath + File.separator + fileName;
//            part.write(url);           //把文件写到指定路径

            res.put("success", 1);
            res.put("message", "上传成功");
            res.put("url", "http://localhost:8080/imageShow?imageFileName=" + newFileName);
        } else {
            res.put("success", 0);
            res.put("message", "上传失败");
        }


        PrintWriter out = response.getWriter();
        out.println(res.toJSONString());
        out.flush();
        out.close();
    }

    /**
     * 根据请求头解析出文件名
     * @param header 请求头
     * @return 文件名
     */
    public String getFileName(String header) {
        String[] temp = header.split(";")[2].split("=");
        //获取文件名，兼容各种浏览器的写法
        String fileName = temp[1].substring(temp[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
        return fileName;
    }
}
